package com.hhsj.androidserver;

import java.io.File;
import java.io.FileFilter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;

@Deprecated
public class PackageScanUtils {

    /**
     * 获取class集合
     *
     * @param packName         包名
     * @param scanSubdirectory 扫描子目录
     * @return
     */
    public static Set<Class<?>> getClasses(String packName, boolean scanSubdirectory) {

        Set<Class<?>> classes = new LinkedHashSet<Class<?>>(); // 装载class集合
        String packageName = packName; // 获取包的名字 并进行替换
        String packageUrlName = packageName.replace('.', '/');
        Enumeration<URL> urls; // 定义一个枚举的集合 并进行循环来处理这个目录下的class
        try {
            urls = Thread.currentThread().getContextClassLoader().getResources(packageUrlName);

            // 循环迭代下去
            while (urls.hasMoreElements()) {

                URL url = urls.nextElement(); // 获取下一个元素

                String protocol = url.getProtocol(); // 得到协议的名称,比如http、file

                if ("file".equals(protocol)) { // 如果是以文件的形式保存在服务器上

                    String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); // 获取包的物理路径
                    // 以文件的方式扫描整个包下的文件 并添加到集合中
                    findClassesInPackageByFile(packageName, filePath, scanSubdirectory, classes);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return classes;
    }

    /**
     * 以文件的方式扫描整个包下的文件 并添加到集合中
     *
     * @param packageName      包名
     * @param packagePath      包路径
     * @param scanSubdirectory 是否扫描子目录
     * @param classes          class集合
     * @throws FileNotFoundException
     */
    public static void findClassesInPackageByFile(String packageName, String packagePath, final boolean scanSubdirectory, Set<Class<?>> classes) throws FileNotFoundException {

        File dir = new File(packagePath); // 获取此包的目录 建立一个File
        File[] dirfiles = dir.listFiles(new FileFilter() { // 如果存在 就获取包下的所有文件 包括目录

            public boolean accept(File file) { // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
                return (scanSubdirectory && file.isDirectory()) || (file.getName().endsWith(".class"));
            }
        });

        for (File file : dirfiles) { // 循环所有文件

            if (file.isDirectory()) { // 如果是目录 则继续扫描
                findClassesInPackageByFile(packageName == "" ? file.getName() : packageName + "." + file.getName(), file.getAbsolutePath(), scanSubdirectory, classes);
            } else { // 如果是java类文件 去掉后面的.class 只留下类名

                String className = file.getName().substring(0, file.getName().length() - 6);
                try {
                    if ("".equals(packageName)) {
                        classes.add(Thread.currentThread().getContextClassLoader().loadClass(className));
                    } else {
                        classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
                    }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }
    }

//    public static void main(String[] args) {
//        Set<Class<?>> clas = PackageScanUtils.getClasses("cn.javax", true);
//        Iterator<Class<?>> cla = clas.iterator();
//        while (cla.hasNext()) {
//            /*Annotation[]ann=cla.next().getAnnotations();
//            for(Annotation a:ann){
//                if(a instanceof WebServlet){
//                    System.out.println(((WebServlet) a).value());
//                }
//            }*/
//            System.out.println(cla.next().getName());
//        }
//    }
}